package com.bosssoft.g1.common.util.web;

import cn.hutool.system.UserInfo;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.bosssoft.g1.common.data.dto.UserTokenDTO;
import com.bosssoft.g1.common.data.vo.RoleVO;
//import io.jsonwebtoken.Claims;
//import io.jsonwebtoken.Jwts;
//import io.jsonwebtoken.SignatureAlgorithm;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author: YuXingZh
 * @Date: Created in 19:45 2024-05-28
 * @Description:
 */
public class JWTUtils {
    private static String SIGNATURE = "token!@#$%^7890";

    /**
     * 生成token
     *
     * @param map //传入payload
     * @return 返回token
     */
    public static String getToken(Map<String, String> map) {
        JWTCreator.Builder builder = JWT.create();
        map.forEach((k, v) -> {
            builder.withClaim(k, v);
        });
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, 7);
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(SIGNATURE)).toString();
    }

    /**
     * 验证token
     *
     * @param token
     */
    public static void verify(String token) {
        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }

    /**
     * 获取token中payload
     *
     * @param token
     * @return
     */
    public static DecodedJWT getToken(String token) {
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }

//    private static final String SECRET_KEY = "your_secret_key";
//
//    public static String generateToken(UserTokenDTO userTokenDTO) {
//        Map<String, Object> claims = new HashMap<>();
//        claims.put("userId", userTokenDTO.getUserId());
//        claims.put("userName", userTokenDTO.getUserName());
//        claims.put("tenantId", userTokenDTO.getTenantId());
//        claims.put("orgId", userTokenDTO.getOrgId());
//        claims.put("companyId", userTokenDTO.getCompanyId());
//
//        List<Map<String, String>> roles = userTokenDTO.getRoleList().stream().map(role -> {
//            Map<String, String> roleMap = new HashMap<>();
//            roleMap.put("name", role.getName());
//            roleMap.put("code", role.getCode());
//            return roleMap;
//        }).collect(Collectors.toList());
//
//        claims.put("roleList", roles);
//
//        return Jwts.builder()
//                .setClaims(claims)
//                .setSubject("User Details")
//                .setIssuedAt(new Date(System.currentTimeMillis()))
//                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10 hours expiry
//                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
//                .compact();
//    }
//
//    public static UserTokenDTO parseToken(String token) {
//        Claims claims = Jwts.parser()
//                .setSigningKey(SECRET_KEY)
//                .parseClaimsJws(token)
//                .getBody();
//
//        UserTokenDTO userTokenDTO = new UserTokenDTO();
//        userTokenDTO.setUserId(((Number) claims.get("userId")).longValue());
//        userTokenDTO.setUserName((String) claims.get("userName"));
//        userTokenDTO.setTenantId(((Number) claims.get("tenantId")).longValue());
//        userTokenDTO.setOrgId(((Number) claims.get("orgId")).longValue());
//        userTokenDTO.setCompanyId(((Number) claims.get("companyId")).longValue());
//
//        List<Map<String, String>> roles = (List<Map<String, String>>) claims.get("roleList");
//        List<RoleVO> roleList = new ArrayList<>();
//        if (roles != null) {
//            roleList = roles.stream().map(roleMap -> {
//                RoleVO roleVO = new RoleVO();
//                roleVO.setName(roleMap.get("name"));
//                roleVO.setCode(roleMap.get("code"));
//                return roleVO;
//            }).collect(Collectors.toList());
//        }
//
//        userTokenDTO.setRoleList(roleList);
//
//        return userTokenDTO;
//    }
//
//    public static void main(String[] args) {
//        UserTokenDTO userTokenDTO = new UserTokenDTO();
//        userTokenDTO.setUserId(123L);
//        userTokenDTO.setUserName("JohnDoe");
//        userTokenDTO.setTenantId(1L);
//        userTokenDTO.setOrgId(2L);
//        userTokenDTO.setCompanyId(3L);
//        userTokenDTO.setRoleList(Collections.emptyList());
//
//        String token = generateToken(userTokenDTO);
//
//        UserTokenDTO parsedUserTokenDTO = parseToken(token);
//        RoleVO role = new RoleVO();
//        role.setName("ROLE_USER");
//        role.setCode("USER");
//
//        userTokenDTO = new UserTokenDTO();
//        userTokenDTO.setUserId(123L);
//        userTokenDTO.setUserName("JohnDoe");
//        userTokenDTO.setTenantId(1L);
//        userTokenDTO.setOrgId(2L);
//        userTokenDTO.setCompanyId(3L);
//        userTokenDTO.setRoleList(Collections.singletonList(role));
//
//        token = generateToken(userTokenDTO);
//
//        parsedUserTokenDTO = parseToken(token);
//    }
}
